Detach guides on unroot
authorMatthias Clasen <mclasen@redhat.com>
Thu, 27 Jun 2019 18:49:54 +0000 (18:49 +0000)
committerEmmanuele Bassi <ebassi@gnome.org>
Sun, 30 Jun 2019 23:10:11 +0000 (00:10 +0100)
We don't want to leave constraints behind.

gtk/gtkconstraintlayout.c

index 9e1cff0049e342b8a07d9758c96aa8552d8aa6d3..fb26f422efff935d35409bab3eacf9951186e5b3 100644 (file)
@@ -1065,6 +1065,7 @@ gtk_constraint_layout_allocate (GtkLayoutManager *manager,
 
 static void gtk_constraint_guide_update (GtkConstraintGuide *guide,
                                          GuideValue          index);
+static void gtk_constraint_guide_detach (GtkConstraintGuide *guide);
 
 static void
 gtk_constraint_layout_root (GtkLayoutManager *manager)
@@ -1117,6 +1118,13 @@ gtk_constraint_layout_unroot (GtkLayoutManager *manager)
       gtk_constraint_detach (constraint);
     }
 
+  g_hash_table_iter_init (&iter, self->guides);
+  while (g_hash_table_iter_next (&iter, &key, NULL))
+    {
+      GtkConstraintGuide *guide = key;
+      gtk_constraint_guide_detach (guide);
+    }
+
   self->solver = NULL;
 }
 
@@ -1327,6 +1335,28 @@ gtk_constraint_guide_update (GtkConstraintGuide *guide,
                                           weight[index]);
 }
 
+static void
+gtk_constraint_guide_detach (GtkConstraintGuide *guide)
+{
+  GtkConstraintSolver *solver;
+  int i;
+
+  if (!guide->layout)
+    return;
+
+  solver = guide->layout->solver;
+  if (!solver)
+    return;
+
+  for (i = 0; i < LAST_GUIDE_VALUE; i++)
+    {
+      gtk_constraint_solver_remove_constraint (solver, guide->constraints[i]);
+      guide->constraints[i] = NULL;
+    }
+
+  g_hash_table_remove_all (guide->data.bound_attributes);
+}
+
 static void
 gtk_constraint_guide_set_property (GObject      *gobject,
                                    guint         prop_id,
@@ -1477,14 +1507,11 @@ void
 gtk_constraint_layout_remove_guide (GtkConstraintLayout *layout,
                                     GtkConstraintGuide  *guide)
 {
-  GtkConstraintSolver *solver;
-
   g_return_if_fail (GTK_IS_CONSTRAINT_LAYOUT (layout));
   g_return_if_fail (GTK_IS_CONSTRAINT_GUIDE (guide));
   g_return_if_fail (guide->layout == layout);
 
-  solver = gtk_constraint_layout_get_solver (guide->layout);
-  clear_constraint_solver_data (solver, &guide->data);
+  gtk_constraint_guide_detach (guide);
   guide->layout = NULL;
 
   g_hash_table_remove (layout->guides, guide);